package bp.sys;

import bp.da.*;
import bp.difference.handler.CommonUtils;
import bp.en.*;
import bp.tools.StringHelper;
import bp.web.*;
import bp.difference.*;
import bp.tools.*;
import bp.wf.GenerWorkFlow;
import net.sf.json.JSONObject;

import java.util.*;

/**
 事件
*/
public class FrmEvents extends EntitiesMyPK
{
	/**
	 执行事件

	 @param dotype 执行类型
	 @param en 数据实体
	 @return null 没有事件，其他为执行了事件。
	*/
	public final String DoEventNode(String dotype, Entity en) throws Exception {
		// return null; // 2019-08-27 取消节点事件 zl
		return DoEventNode(dotype, en, null);
	}
	/**
	 执行事件

	 @param dotype 执行类型
	 @param en 数据实体
	 @param atPara 参数
	 @return null 没有事件，其他为执行了事件。

	 不再使用节点事件 2019-08-27 zl
	 原调用点有两处：（1）FrmEvent.cs 中的DoEventNode()； （2）Flow.cs中的DoFlowEventEntity()方法中，3973行 fes.DoEventNode(doType, en, atPara)。
	 现在都已经取消调用

	*/
	public final String DoEventNode(String dotype, Entity en, String atPara) throws Exception {
		if (this.size()== 0)
		{
			return null;
		}
		String val = _DoEventNode(dotype, en, atPara);
		if (val != null)
		{
			val = val.trim();
		}

		if (DataType.IsNullOrEmpty(val))
		{
			return ""; // 说明有事件，执行成功了。
		}
		else
		{
			return val; // 没有事件.
		}
	}

	/**
	 执行事件，事件标记是 EventList.

	 @param dotype 执行类型
	 @param en 数据实体
	 @param atPara 特殊的参数格式@key=value 方式.
	 @return
	*/
	private String _DoEventNode(String dotype, Entity en, String atPara) throws Exception {
		if (this.size()== 0)
		{
			return null;
		}

		bp.en.Entity tempVar = this.GetEntityByKey(FrmEventAttr.FK_Event, dotype);
		FrmEvent nev = tempVar instanceof FrmEvent ? (FrmEvent)tempVar : null;

		if (nev == null)
		{
			return null;
		}

		GenerDBSrc enDBSrc = new GenerDBSrc();
		String mypk = null;
		// #region 处理参数.
		AtPara ap = new AtPara(atPara);
		Hashtable ht = en.getRow();
		if (ht.containsKey("WorkID") == false)
			ht.put("WorkID", en.getPKVal());

		if (DataType.IsNullOrEmpty(nev.getFlowNo()) == false && ht.containsKey("FlowNo") == false)
			ht.put("FlowNo", nev.getFlowNo());

		if (nev.getNodeID() != 0 && ht.containsKey("NodeID") == false)
			ht.put("NodeID", nev.getNodeID());
		//增加AtPara中的数据
		for(String key : ap.getHisHT().keySet())
		{
			if (ht.containsKey(key) == true)
				continue;
			if (DataType.IsNullOrEmpty(key))
				continue;
			ht.put(key, ap.GetValStrByKey(key));
		}
//		if (ap.getHisHT().containsKey("OID") == false)
//			ap.getHisHT().put("OID", en.getPKVal().toString());
//
//		if (ap.getHisHT().containsKey("WorkID") == false)
//			ap.getHisHT().put("WorkID", en.getPKVal().toString());
//
//		if (DataType.IsNullOrEmpty(nev.getFlowNo()) == false && ap.getHisHT().containsKey("FlowNo") == false)
//			ap.getHisHT().put("FlowNo", nev.getFlowNo());
//
//		if (nev.getNodeID() != 0 && ap.getHisHT().containsKey("NodeID") == false)
//			ap.getHisHT().put("NodeID", String.valueOf(nev.getNodeID()));
		// #endregion 处理参数.



		// #region 节点事件.
		if (nev.getNodeID() > 0)
		{
			mypk = "Node." + nev.getNodeID() + "." + nev.getEventID();
			enDBSrc.setMyPK(mypk);
			if (enDBSrc.RetrieveFromDBSources() == 0)
				return null;
			return bp.sys.GloGenerDBSrc.ExecGenerDBSrc_SFProc(enDBSrc, ht);
		}
		// #endregion 节点事件

        // #region 流程事件.
		if (DataType.IsNullOrEmpty(nev.getFlowNo()) == false)
		{
			mypk = "Flow." + nev.getFlowNo() + "." + nev.getEventID();
			enDBSrc.setMyPK(mypk);
			if (enDBSrc.RetrieveFromDBSources() == 0)
				return null;
			return bp.sys.GloGenerDBSrc.ExecGenerDBSrc_SFProc(enDBSrc, ht);
		}
		// #endregion 流程事件
		// 表单事件
		mypk = "Frm." + nev.getFrmID() + "." + nev.getEventID();
		enDBSrc.setMyPK(mypk);
		if (enDBSrc.RetrieveFromDBSources() == 0)
			return null;
		return bp.sys.GloGenerDBSrc.ExecGenerDBSrc_SFProc(enDBSrc, ht);
	}
	/**
	 事件
	*/
	public FrmEvents()
	{
	}
	/**
	 事件

	 @param fk_MapData FK_MapData
	*/
	public FrmEvents(String fk_MapData) throws Exception {
		QueryObject qo = new QueryObject(this);
		qo.AddWhere(FrmEventAttr.FrmID, fk_MapData);
		qo.DoQuery();
	}
	/**
	 事件

	 @param nodeID 按节点ID查询
	*/
	public FrmEvents(int nodeID) throws Exception {
		QueryObject qo = new QueryObject(this);
		qo.AddWhere(FrmEventAttr.NodeID, nodeID);
		qo.DoQuery();
	}
	public FrmEvents(int nodeID, String fk_flow) throws Exception {
		QueryObject qo = new QueryObject(this);
		qo.AddWhere(FrmEventAttr.NodeID, nodeID);
		qo.addOr();
		qo.addLeftBracket();
		qo.AddWhere(FrmEventAttr.FlowNo, fk_flow);
		qo.addAnd();
		qo.AddWhere(FrmEventAttr.NodeID, 0);
		qo.addRightBracket();
		qo.DoQuery();
	}

	/**
	 得到它的 Entity
	*/
	@Override
	public Entity getNewEntity()
	{
		return new FrmEvent();
	}


		///#region 为了适应自动翻译成java的需要,把实体转换成List.
	/**
	 转化成 java list,C#不能调用.

	 @return List
	*/
	public final java.util.List<FrmEvent> ToJavaList()
	{
		return (java.util.List<FrmEvent>)(Object)this;
	}
	/**
	 转化成list

	 @return List
	*/
	public final ArrayList<FrmEvent> Tolist()
	{
		ArrayList<FrmEvent> list = new ArrayList<FrmEvent>();
		for (int i = 0; i < this.size(); i++)
		{
			list.add((FrmEvent)this.get(i));
		}
		return list;
	}

		///#endregion 为了适应自动翻译成java的需要,把实体转换成List.
}
